#!/bin/bash
# 适用于 AlmaLinux / Rocky Linux 8/9/10 的 SSH 密码登录开启脚本（含安全组提示）


CONFIG_FILE="/etc/ssh/sshd_config"
CONFIG_DIR="/etc/ssh/sshd_config.d"
SSH_PORT=22

echo "=== SSH 密码登录配置检测与修改脚本 ==="

# 检查是否为 root
if [ "$EUID" -ne 0 ]; then
    echo "❌ 请使用 root 权限运行此脚本（例如：sudo bash $0）"
    exit 1
fi

# 检测系统信息
if [ -f /etc/os-release ]; then
    . /etc/os-release
    echo "检测到系统：$NAME $VERSION"
    if [[ "$ID" != "almalinux" && "$ID" != "rocky" ]]; then
        echo "⚠️ 警告：此脚本主要针对 AlmaLinux / Rocky Linux，其他系统可能不兼容"
    fi
fi

# 获取当前配置
PASSWORD_AUTH=$(grep -E "^PasswordAuthentication" "$CONFIG_FILE" | awk '{print $2}')
ROOT_LOGIN=$(grep -E "^PermitRootLogin" "$CONFIG_FILE" | awk '{print $2}')

# 美化输出
printf "%-28s %s\n" "当前 PasswordAuthentication:" "${PASSWORD_AUTH:-未设置}"
printf "%-28s %s\n" "当前 PermitRootLogin:"       "${ROOT_LOGIN:-未设置}"

# 备份配置文件
BACKUP_FILE="${CONFIG_FILE}.bak.$(date +%F_%T)"
cp "$CONFIG_FILE" "$BACKUP_FILE"
echo "已备份原配置文件到 $BACKUP_FILE"

# 修改主配置文件
if grep -q "^#\?PasswordAuthentication" "$CONFIG_FILE"; then
    sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' "$CONFIG_FILE"
else
    echo "PasswordAuthentication yes" >> "$CONFIG_FILE"
fi

if grep -q "^#\?PermitRootLogin" "$CONFIG_FILE"; then
    sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' "$CONFIG_FILE"
else
    echo "PermitRootLogin yes" >> "$CONFIG_FILE"
fi

# 处理 /etc/ssh/sshd_config.d/ 中的覆盖配置
if [ -d "$CONFIG_DIR" ]; then
    for conf in "$CONFIG_DIR"/*.conf; do
        [ -f "$conf" ] || continue
        sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/' "$conf"
        sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' "$conf"
    done
    echo "✅ 已处理 $CONFIG_DIR 中可能覆盖的配置"
fi

# 重启 SSH 服务
if systemctl restart sshd; then
    echo "✅ SSH 服务已重启"
else
    echo "❌ SSH 服务重启失败"
    exit 1
fi

# 检查防火墙
if command -v firewall-cmd &>/dev/null && firewall-cmd --state &>/dev/null; then
    firewall-cmd --permanent --add-service=ssh
    firewall-cmd --reload
    echo "✅ 已确保 firewalld 开放 SSH 端口"
else
    echo "ℹ️ 未检测到 firewalld 或防火墙未运行，跳过防火墙配置"
fi

# 检查 SELinux 状态
if command -v getenforce &>/dev/null; then
    SELINUX_STATUS=$(getenforce)
    echo "ℹ️ 当前 SELinux 状态: $SELINUX_STATUS"
    if [ "$SELINUX_STATUS" = "Enforcing" ]; then
        echo "⚠️ SELinux 处于强制模式，可能影响 root 密码登录"
        echo "  你可以临时关闭测试: setenforce 0"
    fi
fi

# 检查本地端口监听
if ss -tnlp | grep -q ":$SSH_PORT"; then
    echo "✅ SSH 服务正在监听端口 $SSH_PORT"
else
    echo "⚠️ SSH 服务未监听端口 $SSH_PORT，请检查配置"
fi

# 云厂商安全组提示
echo "💡 提示：即使本地已开放端口，云服务器提供商（阿里云、腾讯云、AWS、Azure 等）的安全组规则也可能阻止 SSH 连接。"
echo "   请登录云控制台，确保已放行 TCP $SSH_PORT 端口。"

echo "🎉 SSH 密码登录（含 root）已开启"
